package ia;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;


enum Orientacion{N,S,E,O,NO,NE,SO,SE};
public class General {
    private static General instancia = new General();
    
    private Orientacion or;
    private int[][]     peligrosidad;
    private int[]       posicionAbdel  = new int[2];
    private int[]       posicionGertru = new int[2];
    private Busqueda    algoritmo;

    private General(){ }
 
    public static General getInstancia(){
        return instancia;
    }
  

    public void leeMatriz() throws FileNotFoundException, IOException{
        ArrayList<int[]> l = new ArrayList<int[]>();
        File m = new File("matriz");
        int i,j,tamAux=0;
        int[] lineaEnteros;
        boolean first = true;
        if (m.canRead()){
            j=0;
            BufferedReader entrada =  new BufferedReader(new FileReader(m));
            String aux;
            while((aux = entrada.readLine())!=null){
                i=0;
                System.out.println(aux);
                char[] linea = aux.toCharArray();
                lineaEnteros = new int[linea.length];
                for (i=0;i<linea.length;i++){
                    if(linea[i]=='A') {
                        posicionAbdel[0] = j;
                        posicionAbdel[1] = i;
                        lineaEnteros[i] = 1;
                    }else if(linea[i]=='G'){
                        posicionGertru[0] = j;
                        posicionGertru[1] = i;
                        lineaEnteros[i] = 1;
                    }else lineaEnteros[i] = Integer.parseInt(String.valueOf(linea[i]));
                }
                if (first) {
                    tamAux = linea.length;
                    first = false;
                }
                else if (linea.length != tamAux) throw new IllegalArgumentException("La matriz no esta bien definida.");
                l.add(lineaEnteros);
                j++;
            }
        }
        peligrosidad = new int[l.size()][tamAux];
        i=0;
        for (int[] o : l){
            peligrosidad[i] = o;
            i++;
        }
    }

    public void setOrientacion(Orientacion orientacion){
        this.or = orientacion;
    }

    public Orientacion getOrientacion(){
        return this.or;
    }

    public int[] getPosAbdel(){
        return posicionAbdel;
    }

    public int[] getPosGertru(){
        return posicionGertru;
    }
    public int[][] getMatriz(){
        return peligrosidad;
    }

    public void setPosAbdel(int[] posR){
        this.posicionAbdel = posR;
    }

    public void setPosGertru(int [] posM){
        this.posicionGertru = posM;
    }

    public void setMatriz(int[][] matriz){
        this.peligrosidad = matriz;
    }

    public void setAlgoritmo(Busqueda b){
        this.algoritmo = b;
    }

    public float aplicaBusqueda(){
        return this.algoritmo.buscar();
    }

    public  int[][] getMatrizAleatoria(int fil, int col){
    	if (fil == 1 && col == 1) {
    		System.out.println("La matriz debe ser mayor de 1x1");
    		System.exit(1);
    	}
        int [][] matriz = new int[fil][col];
        Random rnd=new Random();
        for(int i=0;i<fil;i++){
            for(int j=0;j<col;j++){
                matriz[i][j] = rnd.nextInt(5)+1;                
            }
        }
        // Iniciar posiciones de Abdel y Gertru 
        boolean cond = true;
        while(cond) {
        	
	        posicionAbdel[0]  = rnd.nextInt(fil);
	        posicionAbdel[1]  = rnd.nextInt(col);
	        posicionGertru[0] = rnd.nextInt(fil);
	        posicionGertru[1] = rnd.nextInt(col);
	        
	        if ((posicionAbdel[0] != posicionGertru[0]) ||  (posicionAbdel[1] != posicionGertru[1])) cond = false;
        }
        
        
        System.out.println("abdel:"+posicionAbdel[0]+","+posicionAbdel[1]);
        System.out.println("gertru:"+posicionGertru[0]+","+posicionGertru[1]);
        System.out.println("MATRIZ DEL PROBLEMA: ");
        for(int i=0; i<fil;i++){
            for(int j=0;j<col;j++) System.out.print(matriz[i][j]);
            System.out.println();
        }
        
        peligrosidad = new int[fil][col];
        int i=0;
        for (int[] o : matriz){
            peligrosidad[i] = o;
            i++;
        }

        return matriz;
    }

    public Orientacion orientacionAleatoria(){
        Orientacion or = null;
        Random i = new Random();
        switch(i.nextInt(4)){
            case 0: return or.N;
            case 1: return or.S;
            case 2: return or.E;
            case 3: return or.O;
        }
        return or;
    }    

    public void getProblemaAleatorio(){
        int[][] matriz = getMatrizAleatoria(7,7);
        this.setMatriz(matriz);
    }
    
    public void getSituacionAleatoria(){
        Random rnd      = new Random();
        int fil         = this.peligrosidad.length;
        int col         = this.peligrosidad[0].length;
        Orientacion ori = orientacionAleatoria();
        int[] posG      = new int[2];
        int[] posA      = new int[2];
      
        posG[0] = rnd.nextInt(fil);
        posG[1] = rnd.nextInt(col);           
        posA[0] = rnd.nextInt(fil);
        posA[1] = rnd.nextInt(col);
        
        this.setPosGertru(posG);
        this.setPosAbdel(posA);
        this.setOrientacion(ori);
    }    


    public float calculaMedia(int n, ArrayList<Float> h, ArrayList<Float> r){
    	
        float err = 0, media = 0;
        for(int i=0;i<n;i++){
            if(h==null){
                media = media + r.get(i);
            }
            else{
                err =  Math.abs(h.get(i)-r.get(i));
                media = media + err;
            }
        }
        return (media/n);
    }
}
